#ifndef _VISITEUR
#define _VISITEUR

#include<stdlib.h>
#include<stdio.h>
#include"Espace.h"
#include"Vecteur.h"


/**
*\file Visiteur.h
*\brief Fichier d'en-tête Visiteur.h. 
*
*Ce fichier d'en-tête gère tout ce qui concerne le personnage, c'est-à-dire son existence et ses déplacements
*
*\author Quentin LEONE
*\version version finale
*/


/**
* \struct visiteur
* \brief Structure du personnage
* Cette structure permet de définir les caractéristiques du personnage
*/
typedef struct
{
  vecteur * caseRegard; /**< pointeur sur la première case où garde le personnage*/
  vecteur * casePied; /**< pointeur sur la première case où personnage a ses pieds*/
  vecteur * caseEmplacement; /**< pointeur sur la case où le personnage est situé*/
}visiteur;



/**
*\fn void visiteurInit (visiteur * joueur, vecteur * v, char pied, char regard, int n);
*\brief Cette fonction initialise le visiteur
*\param [out] *joueur : pointeur sur le visiteur à initialiser
*\param [in] *v : pointeur sur le vecteur donnant les positions initiales du joueur
*\param [in] pied : case où sont les pieds du joueur
*\param [in] regard : case où regarde le joueur
*\param [in] n : taille du labyrinthe
*\pre Les coordonnées du vecteur doivent être positives et strictement inférieures à la taille de l'espace.
*\post Le visiteur est initialisé dans le tas avec les informations données par les paramètres.
*\warning Cette fonction implique obligatoire l'utilisation de la fonction freeVisiteur lorsqu'il n'y aura plus utilité du joueur.
*/
void visiteurInit(visiteur * joueur, vecteur * v, char pied, char regard, int n);


/**
*\fn void visiteurInit2(visiteur *joueur,vecteur * position,vecteur *pied,vecteur *regard);
*\brief Initialise un joueur à partir de vecteur
*\param [in] *joueur : pointeur sur le joueur à initialiser
*\param [in] *position : pointeur sur le vecteur donnant la case emplacement
*\param [in] *pied : pointeur sur le vecteur donnant la case des pieds
*\param [in] *regard : pointeur sur le vecteur donnat la cese du regard
*\pre Le joueur ne doit pas être déjà initialisé est les différent vecteur doivent être cohérent.
*\post Le joueur est initialisé avec ces différents vecteurs.
*\warning Cette fonction implique obligatoire l'utilisation de la fonction freeVisiteur lorsqu'il n'y aura plus utilité du joueur.
*/
void visiteurInit2(visiteur *joueur,vecteur * position,vecteur *pied,vecteur *regard);

/**
*\fn void visiteurAvance(visiteur * joueur, espace * esp);
*\brief Le visiteur avance d'une case dans l'espace qui lui est associée
*\param [in,out] *joueur : pointeur sur le joueur
*\param [in] *esp : pointeur sur l'espace
*\pre le joueur et l'espace doivent être initialisés
*\post le joueur a avancé d'une case dans le direction où il regardait
*/
void visiteurAvance(visiteur * joueur, espace * esp);


/**
*\fn void visiteurChangeDirection(visiteur * joueur, espace * esp, char c);
*\brief Le joueur effectue une rotation sur sa case
*\param *joueur : pointeur sur le joueur
*\param *esp : pointeur sur l'espace
*\param c : nouvelle direction : 'd' pour tourner sur la droite, 'g' pour aller sur la gauche, 'b' pour se retourner
*\pre le joueur et l'espace doivent être initialisés
*\post le joueur a changé de direction
*/
void visiteurChangeDirection(visiteur * joueur, espace * esp, char c);


/**
*\fn void getCaseEmplacement(visiteur * joueur, vecteur * v);
*\brief Le vecteur v prend les coordonnées où est situé le joueur
*\param *joueur : pointeur sur le joueur
*\param *v : pointeur sur le vecteur qui doit prendre les nouvelles coordonnées
*\pre Le joueur doit être initialisé
*\post v a les coordonnées du joueur
*/
void getCaseEmplacement(visiteur * joueur, vecteur * v);


/**
*\fn void getCasePied(visiteur * joueur, vecteur * v);
*\brief Le vecteur v prend les coordonnées où sont situés les pied du joueur
*\param *joueur : pointeur sur le joueur
*\param *v : pointeur sur le vecteur qui doit prendre les nouvelles coordonnées
*\pre Le joueur doit être initialisé
*\post v a les coordonnées des pied du joueur
*/
void getCasePied(visiteur * joueur, vecteur * v);



/**
*\fn void getCaseRegard(visiteur * joueur, vecteur * v);
*\brief Le vecteur v prend les coordonnées où regarde le joueur
*\param *joueur : pointeur sur le joueur
*\param *v : pointeur sur le vecteur qui doit prendre les nouvelles coordonnées
*\pre Le joueur doit être initialisé
*\post v a les coordonnées de la case où regarde le joueur
*/
void getCaseRegard(visiteur * joueur, vecteur * v);


/**
*\fn void setCaseRegard(visiteur * joueur, vecteur * v);
*\brief Remplace le champs de la structure par le vecteur v.
*\param [in,out] *joueur : pointeur sur la strucure à modifier
*\param [in] *v : pointeur sur le vecteur
*\post Le champs du joueur a été modifié
*/
void setCaseRegard(visiteur * joueur, vecteur * v);


/**
*\fn void setCasePied(visiteur * joueur, vecteur * v);
*\brief Remplace le champs de la structure par le vecteur v.
*\param [in,out] *joueur : pointeur sur la strucure à modifier
*\param [in] *v : pointeur sur le vecteur
*\post Le champs du joueur a été modifié
*/
void setCasePied(visiteur * joueur, vecteur * v);

/**
*\fn void setCaseEmplacement(visiteur * joueur, vecteur * v);
*\brief Remplace le champs de la structure par le vecteur v.
*\param [in,out] *joueur : pointeur sur la strucure à modifier
*\param [in] *v : pointeur sur le vecteur
*\post Le champs du joueur a été modifié
*/
void setCaseEmplacement(visiteur * joueur, vecteur * v);

/**
*\fn void freeVisiteur(visiteur * joueur);
*\brief Libère du tas le visiteur
*\param *joueur : pointeur sur le joueur à libérer
*\pre Le joueur doit être initialisé
*\post Le joueur ne doit plus être présent dans le tas
*\warning Cette fonction est à utiliser avec initVisiteur. Les données du joueur seront définitivement perdues.
*/
void freeVisiteur(visiteur * joueur);

#endif
